package com.likou;

public class q5 {

    // 动态规划
    public String longestPalindrome(String s) {
        int n = s.length();
        String ans = "";
        int maxLen = 0;
        boolean[][] dp = new boolean[n][n];
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i; j < n; j++) {
                if (i == j) {
                    dp[i][j] = true;
                } else if (j - i <= 2 && s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = true;
                } else if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
                    dp[i][j] = true;
                }

                if (dp[i][j] && j - i + 1 > maxLen) {
                    maxLen = j - i + 1;
                    ans = s.substring(i, j + 1);
                }

            }
        }

        return ans;
    }

    // 双指针
//    public String longestPalindrome(String s) {
//        int n = s.length();
//        String ans = "";
//        int maxLen = 0;
//        for (int i = 0; i < n; i++) {
//            // 奇数
//            int left = i;
//            int right = i;
//            while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
//                if ((right - left + 1) > maxLen) {
//                    maxLen = right - left + 1;
//                    ans = s.substring(left, right + 1);
//                }
//                left--;
//                right++;
//            }
//
//            // 偶数
//            left = i;
//            right = i + 1;
//            while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
//                if ((right - left + 1) > maxLen) {
//                    maxLen = right - left + 1;
//                    ans = s.substring(left, right + 1);
//                }
//                left--;
//                right++;
//            }
//        }
//
//        return ans;
//    }

    // 暴力，超时
//    public String longestPalindrome(String s) {
//        int n = s.length();
//        String ans = "";
//        int maxLen = 0;
//        int left = 0;
//        int right;
//        for (; left < n; left++) {
//            for (right = left; right < n; right++) {
//                String substring = s.substring(left, right + 1);
//                if (isHW(substring) && substring.length() > maxLen) {
//                    maxLen = substring.length();
//                    ans = substring;
//                }
//            }
//        }
//
//        return ans;
//
//    }


    private boolean isHW(String s) {
        int n = s.length();
        for (int i = 0; i < n / 2; i++) {
            if (s.charAt(i) != s.charAt(n - i - 1)) {
                return false;
            }
        }

        return true;
    }
}
